package com.info.zhiduoduo.common.utils;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * 使用AES/CBC/PKCS5Padding加密方式的加解密工具类
 */
public class AesCbcUtil {

	/*
	 * 加密用的Key 可以用26个字母和数字组成
	 * 此处使用AES-128-CBC加密模式，key需要为16位。
	 */
	private static String sKey = "2CN69XRdW2Qw6uM6";
	private static String ivParameter = "8XJcWY5GCrxR1ZdF";

	// 加密
	public static String encrypt(String sSrc) throws Exception {
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		byte[] raw = sKey.getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使用CBC模式，需要一个向量iv，可增加加密算法的强度
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
		byte[] encrypted = cipher.doFinal(sSrc.getBytes(StandardCharsets.UTF_8));
		return Base64.getEncoder().encodeToString(encrypted);//此处使用BASE64做转码。
	}

	// 解密
	public static String decrypt(String sSrc) throws Exception {
		// 除掉换行符
		sSrc = sSrc.replaceAll("\n", "");
		byte[] raw = sKey.getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
		cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
		byte[] encrypted1 = Base64.getDecoder().decode(sSrc);//先用base64解密
		byte[] original = cipher.doFinal(encrypted1);
		String originalString = new String(original, StandardCharsets.UTF_8);
		return originalString;
	}
}
